#include "rec.h"

//比较函数
int rec_comparator(const void *pa,const void *pb){
	prec_sort_t prec_a = (prec_sort_t)pa;
	prec_sort_t prec_b =(prec_sort_t)pb;
	if(prec_a->best_sec > prec_b->best_sec)
		return 1;
	if(prec_a->best_sec < prec_b->best_sec)
		return -1;
	return 0;
}

//对prec结构中的选手best_sec从小到大排序，返回排序后的rec_sort_t数组；需要free释放。
prec_sort_t db_rec_sort(prec_t prec){
	prec_sort_t sorted_ary = malloc(sizeof(rec_sort_t) * PERSON_COUNT);
	for(int i = 0;i < PERSON_COUNT;i++){
		sorted_ary[i].idx = i;
		sorted_ary[i].best_sec = prec->best_recs[i];
	}
	qsort(sorted_ary,PERSON_COUNT,sizeof(rec_sort_t),rec_comparator);
	return sorted_ary;
}

//读取数据库内容到rec_t结构中
bool db_read(prec_t prec){
	if(!prec) return false;
	FILE *fp = NULL;

	if(access(DB_PATH,F_OK) != 0){
		printf("%s:%s 不存在!!!先更新数据库文件！\n",__func__,DB_PATH);
		return false;
	}

	if((fp = fopen(DB_PATH,"r")) == NULL){
		printf("%s:打开文件失败\n",__func__);
		return false;
	}

	if(1 != fread(prec,sizeof(rec_t),1,fp)){
		printf("%s:读取文件失败\n",__func__);
		return false;
	}

	fclose(fp);
	return true;
}

//将数据库内容“清零”
void db_clear(void){
	FILE *fp = NULL;
	prec_t prec = malloc(sizeof(rec_t));
	memset(prec,0,sizeof(rec_t));

	if((fp = fopen(DB_PATH,"w")) == NULL){
		printf("%s:创建文件失败\n",__func__);
		return;
	}

	if(1 != fwrite(prec,sizeof(rec_t),1,fp)){
		printf("%s:写入文件失败\n",__func__);
		return;
	}

	fclose(fp);
}

//更新rct_t结构到数据库，每次覆盖写入
bool db_update(prec_t prec){
	if(!prec) return false;
	FILE *fp = NULL;

	if(access(DB_PATH,F_OK) != 0){
		printf("%s:%s 不存在，新建之...\n",__func__,DB_PATH);
	}

	if((fp = fopen(DB_PATH,"w")) == NULL){
		printf("%s:创建文件失败\n",__func__);
		return false;
	}

	if(1 != fwrite(prec,sizeof(rec_t),1,fp)){
		printf("%s:写入文件失败\n",__func__);
		return false;
	}

	fclose(fp);
	return true;
}
